import com.sun.xml.internal.ws.api.ha.StickyFeature;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Locale;


class Person{
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    //字符串的截取
    public static void main(String[] args) {
        //字符串的截取
        String str1 = "hello";
        String ret1 = str1.substring(1);//从位置1开始截取字符串剩下的部分
        System.out.println(ret1);
        String ret2 = str1.substring(1,3);//采用左闭右开的方式[1,3)截取字符串
        System.out.println(ret2);
        //去除字符串的左右空格，保留中间空格
        String str2 = "    hello   jd os pa   ";
        String ret3 = str2.trim();
        System.out.println(ret3);
    }
    //字符串的分割
    public static void main8(String[] args) {
        String str1 = "hello world hello lcc";
        String[] strings = str1.split(" ");
        String[] strings1 = str1.split(" ",2);//表示按照" "只是将原字符串分割为两个部分
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
        for (int i = 0; i < strings1.length; i++) {
            System.out.println(strings1[i]);
        }
        //特殊的分隔符的书写方式
        String str2 = "192.168.0.0.1";
//        String[] ret2 = str2.split(".");//此时分割不会成功,因为对于"."，"\\"这些特殊字符不能直接使用，需要进行转义
        String[] ret2 = str2.split("\\.");//通过使用\\对字符进行转义
        for (int i = 0; i < ret2.length; i++) {
            System.out.println(ret2[i]);
        }
        //特别需要注意\的转义，如下：
        String str3 = "11\\22\\33\\44\\55\\66";//需要注意，这里需要使用两个\\才能转换为\字符
        String[] ret3 = str3.split("\\\\");
        for (int i = 0; i < ret3.length; i++) {
            System.out.println(ret3[i]);
        }
        //多种分隔符，多次分割
        String str4 = "name=zhangsan&age=20";
        //使用多种分隔符
        String[] str5 = str4.split("=|&");//根据=和&两种分隔符进行分割
        for (int i = 0; i < str5.length; i++) {
            System.out.println(str5[i]);
        }
        //进行多次分割
        String[] ret4 = str4.split("=");
        for (int i = 0; i < ret4.length; i++) {
            String[] ret5 = ret4[i].split("=");//进行第二次分割
            for (String s:ret5) {
                System.out.println(s);
            }
        }
    }
    //字符串的替换
    public static void main7(String[] args) {
        String str1 = "ababcabcdabcdeabcdef";
        String ret1 = str1.replaceFirst("ab","ooo");//将第一个出现的字符串ab转换为ooo
        String ret2 = str1.replaceAll("ab","ooo");//将字符串里面的所有子字符串ab全转化为ooo
        String ret3 = str1.replace("ab","ppp");//原理同replaceAll
        String ret4 = str1.replace('a','p');//将字符串里面的字符a全转换为p
        System.out.println(ret1);
        System.out.println(ret2);
        System.out.println(ret3);
        System.out.println(ret4);
    }
    //可变参数
    public static int add(int a,int b){
        return a + b;
    }
    public static int add(int a,int b,int c){
        return a + b +c;
    }
    public static int add(int...args){//当参数超过定义好的参数个数，就会自动调用这个函数进行求和
        int ret = 0;
        for (int i = 0; i < args.length; i++) {
            ret += args[i];
        }
        return ret;
    }
    public static void main6(String[] args) {
        int[] array = {1,2,3,45,5,6,7};
        int ret = add(array);
        System.out.println(ret);
        System.out.println(add(1,42,33,1,66,77,8,4,8,23,1,3,89,90));
    }
    public static void main5(String[] args) {
        //字符串的大小写转换
        String str1 = "hello";
        String ret = str1.toUpperCase();//所有对字符串的修改都不是在原来的基础上，而是新建了一个对象，比如这里新建了一个字符串用于接收转换后的字符串
        System.out.println(str1);//输出hello
        System.out.println(ret);//输出HELLO
        System.out.println("============");
        String str2 = "ABCDE";
        System.out.println(str2.toLowerCase());
        System.out.println("============");
        //将字符串转换为数组
        String str3 = "helloworld!";
        char[] chars = str3.toCharArray();//用字符数组chars接收转换后的数组
        System.out.println(Arrays.toString(chars));
        //数组转字符串，直接使用字符串的定义之一就可以
        char[] array = {'a','b','c','d','e','f'};
        String str4 = new String(array);
        System.out.println(str4);
        //字符串的格式化输出
        String str5 = String.format("%d,%d",10,20);
        System.out.println(str5);//输出10，20
    }
    public static void main4(String[] args) {
        System.out.println(String.valueOf(1234));//将数字1234转化为字符串进行输出
        Person person1 = new Person("zhangsan",20);
        System.out.println(String.valueOf(person1));//可以将类对象转换为字符串输出，因为String.valueof就是调用的toString方法，所以重写toString方法会修改结果的输出
        System.out.println(Integer.valueOf("1234"));//实现字符串转数字
        System.out.println(Integer.parseInt("12345"));//也是实现字符串转数字，因为Integer.valueOf里面就是调用的parseInt
        System.out.println(Integer.parseInt("100",16));//后面的16代表转化后的数字的进制，即将前面的字符串转化为16进制的数组
    }
    public static void main3(String[] args) {
        String str1 = "hello";
        char c1 = str1.charAt(1);//charAt实现对字符串里面index指向的字符的查询
        System.out.println(c1);//输出e
        System.out.println(str1.indexOf('l'));//返回字符l在字符串中第一次出现的位置，会输出2
        System.out.println(str1.indexOf('l', 3));//从3位置开始寻找字符l在字符串中出现的位置
        System.out.println(str1.indexOf("ll", 1));//从字符串的位置1，开始寻找字符串ll第一次出现的位置
        System.out.println(str1.lastIndexOf('l'));//对字符串从右向左找首次出现字符l的位置，所以这里会输出3，而不是2
        System.out.println(str1.lastIndexOf('l',2));//从字符串的位置2（也就是e后面的l)开始，对字符串从右向左找首次出现字符l的位置
        System.out.println(str1.lastIndexOf("ll", 3));//从字符串的位置3开始，从对字符串从右向左找首次出现字符l的位置后往前找首次出现字符串ll的位置
    }
    public static void main2(String[] args) {
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2);//次数输出false，因为对于引用类型（字符串类型属于引用类型），==比较的是字符串str1和str2的值，也就是两个字符串的地址
        System.out.println(str1.equals(str2));//此时输出的是true,因为equals实现了两个字符串值的比较
        String str3 = "abcde";
        String str4 = "abcde";
        System.out.println(str3 == str4);//此时输出的是true，常量池，两个字符串指向的同一个字符串值，也就是存放的是同一个地址，故相等。
        String str5 = "abcd";
        String str6 = "abCd";
        System.out.println(str5.compareTo(str6));//CompareTo实现两个字符串大小的比较，如果前面比后面大（小），则输出正数（负数），相等输出0
        System.out.println(str5.compareToIgnoreCase(str6));//此时也会进行字符串大小的比较，知识忽略了字符的大小写，所以这里会输出0
    }
    public static void main1(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");
        char[] chars = {'a','b','c','d','e'};//字符串的定义
        String str3 = new String(chars);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println("============");
        System.out.println(str1.length());//求字符串的长度
        String str4 = "";
        System.out.println(str4.isEmpty());//查询str4字符串是否为空，因为这里str4里面没有字符，所以该字符串为空，故输出true
        String str5 = null;//表示str5不指向任何对象
//        System.out.println(str5.isEmpty());//此时会出现空指针异常的情况
    }
}
